package main

import (
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
	"github.com/go-playground/validator/v10"
)

// UserVaildator 定义了用户验证的结构体
// 包含用户名和年龄字段，这两个字段是必填的
// 用户名还需要满足 "sign" 的验证规则
type UserVaildator struct {
	Name string `json:"name" binding:"required,sign" msg:"用户名不能为空"`
	Age  int    `json:"age" binding:"required" msg:"年龄不能为空"`
}

// signValid 是一个自定义的验证函数
// 用于验证用户名是否为 "test"，是的话返回 false，否则返回 true
func signValid(fl validator.FieldLevel) bool {
	val := fl.Field().Interface().(string)
	return val != "test"
}

func main() {
	// 初始化 gin 框架的默认路由器
	router := gin.Default()

	// 获取验证引擎，并注册自定义的验证规则 "sign"
	if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
		v.RegisterValidation("sign", signValid)
	}

	// 处理 POST 请求，尝试绑定请求体到 UserVaildator 结构体
	// 如果绑定失败，返回错误信息
	// 如果绑定成功，返回用户信息
	router.POST("/", func(c *gin.Context) {
		var user UserVaildator
		if err := c.ShouldBind(&user); err != nil {
			c.JSON(200, gin.H{"error": err.Error()})
			return
		}
		c.JSON(200, gin.H{"user": user})
	})

	// 启动服务器，监听 8080 端口
	router.Run(":8080")
}
